home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2002 #11 / Amiga Plus CD - 2002 - No. 11.iso / Tools / MorphOS / tictactoe-1.2.1 / scores.c < prev    next >
C/C++ Source or Header  |  2002-10-22  |  2KB  |  100 lines

  1. #include "messages.h"
  2. #include "scores.h"
  3. #include "t3types.h"
  4. #include "line_o_s.h"
  5. #include "moves.h"
  6.  
  7. int get_winning_position(int who) {
  8.     int y, x;
  9.     int position=-1;
  10.     
  11.     for(y=0; y<SIZE && position==-1; y++) 
  12.         for(x=0; x<SIZE && position==-1; x++) 
  13.             if(!board[y][x]) {
  14.                 board[y][x]=who;    /* do it */
  15.                 if(end_of_game()==who)
  16.                     position=y*SIZE+x;
  17.                 board[y][x]=0;        /* undo it */
  18.             }
  19.     return position;
  20. }
  21.  
  22. int get_centre_score(int row, int col, int who) {
  23.     int centre = SIZE/2;
  24.     if(row==centre && col==centre && board[centre][centre]==0)
  25.         return CENTRE_SCORE;
  26.     return 0;
  27. }
  28.  
  29. int get_corner_score(int row, int col, int who) {
  30.     if((row>0 && row<SIZE-1) || (col>0 && col<SIZE-1))
  31.         return 0;
  32.     if(board[row][col]==0)
  33.         return CORNER_SCORE;
  34.     return 0;
  35. }
  36.  
  37. int get_los_score(int row, int col, int who) {
  38.     int score=0, i;
  39.     int (*possible[3])(int, int, int)={
  40.         col_possible, row_possible, dia_possible
  41.     };
  42.  
  43.     if(board[row][col])
  44.         return 0;
  45.  
  46.     for(i=0; i<3; i++)
  47.         score+=possible[i](row, col, who);
  48.  
  49.     print_debug("Line of sight score(%d,%d): %d", row, col, score);
  50.     return score;
  51. }
  52.  
  53. int get_sticky_score(int row, int col, int who) {
  54.     int y, x;
  55.     int score=0;
  56.  
  57.     if(board[row][col])
  58.         return 0;
  59.  
  60.     for(y=row-1; y<=row+1; y++) {
  61.         if(y<0 || y>SIZE-1)
  62.             continue;
  63.         for(x=col-1; x<=col+1; x++) {
  64.             if(x<0 || x>SIZE-1)
  65.                 continue;
  66.             if(y==row && x==col)
  67.                 continue;
  68.             if(board[y][x]==-who)
  69.                 score+=STICKY_SCORE;
  70.         }
  71.     }
  72.  
  73.     print_debug("Sticky score(%d,%d): %d", row, col, score);
  74.     return score;
  75. }
  76.  
  77. int set_scores(int who) {
  78.     int y, x, pos=-1;
  79.     int i;
  80.     int (*get_score[4])(int, int, int) = {
  81.         get_centre_score, 
  82.         get_los_score, 
  83.         get_sticky_score, 
  84.         get_corner_score
  85.     };
  86.  
  87.     for(y=0; y<SIZE; y++)
  88.         for(x=0; x<SIZE; x++) {
  89.             for(i=0, scores[y][x]=0; i<4; i++)
  90.                 scores[y][x]+=get_score[i](y, x, who);
  91.             if(scores[y][x] > 0 && (pos < 0 ||
  92.                 scores[y][x] > scores[pos/SIZE][pos%SIZE]))
  93.                 pos=y*SIZE+x;
  94.         }
  95.  
  96.     return pos;
  97. }
  98.  
  99.  
  100.